package com.shujia.network.tcp.talk;

import org.junit.Test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

// 客户端给服务端发送文本，服务端会将文本转成大写在返回给客户端。
public class TcpTest6 {

    @Test
    public void client() throws IOException {
        // 指定ip地址和端口号
        Socket s = new Socket(InetAddress.getLocalHost(), 6666);

        // 使用 可以简化 BufferedWriter
        PrintWriter pw = new PrintWriter(s.getOutputStream());

        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));

        // 键盘录入
        // 支持循环写入数据, 如果写入的exit, 结束写入
        Scanner sc = new Scanner(System.in);
        while (true) {
            String msg = sc.next();
            pw.println(msg); // 写入字符串并且换行
            pw.flush();

            // 接收数据并打印
            String resp = br.readLine();
            System.out.println(resp);
            if ("exit".equals(msg)) {
                break;
            }
        }

        pw.close();// 关闭输出流, 表示数据写入Socket完成
        sc.close();
        s.close();
    }


    /*
    服务端需要支持连接多个client
     */
    @Test
    public void server() throws IOException {
        // 监听本机指定端口
        ServerSocket ss = new ServerSocket(6666);

        // 阻塞获取客户端的连接
        Socket s = ss.accept();
        // 读取文件到内存
        BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        PrintWriter pw = new PrintWriter(s.getOutputStream());

        while (true) {

            // 读的是一行数组, 要有换行才能是一行数据
            String msg = br.readLine();
            if ("exit".equals(msg)) {
                pw.println("bye");
                pw.flush();
                break;
            } else {
                pw.println(msg);
                pw.flush();
            }
        }

        // 关闭资源
        br.close();
        s.close();
        ss.close();
    }
}
